﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using PlanoAulaHelper.Reports;

namespace PlanoAulaHelper
{
    public partial class ConteudoPlanoAulaForm : FormEdicao
    {
        
        public ConteudoPlanoAulaForm(PlanoAulaCab pac) : base(pac.Id)
        {
            InitializeComponent();
        }
        private bool DiaCadastrado(DateTime data)
        {
            using (dbContext dc = new dbContext())
            {
                return (from p in dc.PlanoAulaDetalhes 
                        where p.IdPlanoAulaCab == this.IdItem && p.Data.Date == data.Date && 
                        (p.HoraInicio * 60 + p.MinutoInicio) >= ( data.Hour *60 + data.Minute )&& 
                        ( p.HoraFinal * 60 + p.MinutoFinal ) <= ( data.Hour *60 + data.Minute )
                        select p).Count() >= 1;
            }
        }
        private void toolStripButtonGerarDadosIniciais_Click(object sender, EventArgs e)
        {
            using (dbContext dc = new dbContext())
            {
                var planoAulaCab = (from p in dc.PlanoAulaCabs where p.Id == this.IdItem select p).Single();
                
                var resultadoDiasNaoUteis = (from dnu in dc.DiaNaoUtils select dnu);

                var diasAula = (from d in dc.DiaAulas
                                       where d.IdPlanoAulaCab == this.IdItem
                                       select d);
                 
                DateTime temp = planoAulaCab.De;
                while (temp.Date <= planoAulaCab.Ate.Date)
                {
                    bool diaValido = (from d in resultadoDiasNaoUteis
                                      where d.Data == temp.Date
                                      select d).Count() == 0;
                    if (diaValido)
                    {
                        var diasHoras = from d in diasAula
                                        where d.Dia == (int)temp.DayOfWeek
                                        select d;
                        if (diasHoras != null)
                        {
                            foreach (DiaAula d in diasHoras)
                            {
                                DateTime diaParaCadastrar = new DateTime(temp.Year, temp.Month, temp.Day, d.HoraInicio, d.MinutoInicio, 0);
                                bool diaCadastrado = DiaCadastrado(diaParaCadastrar);
                                if (!diaCadastrado && diaValido) //cbxDiaAula.CheckedItems.Contains(temp.DayOfWeek) && DiaValido(temp))
                                {
                                    PlanoAulaDetalhe pad = new PlanoAulaDetalhe
                                    {
                                        Data = temp,
                                        IdPlanoAulaCab = planoAulaCab.Id,
                                        HoraInicio = d.HoraInicio,
                                        MinutoInicio = d.MinutoInicio,
                                        HoraFinal = d.HoraFinal,
                                        MinutoFinal = d.MinutoFinal

                                    };
                                    planoAulaCab.PlanoAulaDetalhes.Add(pad);
                                    //dc.PlanoAulaDetalhes.InsertOnSubmit(pad);
                                }
                            }
                        }
                    }
                    temp = temp.AddDays(1);
                }
                dc.SubmitChanges();
            }
            AtualizarDados();
        }

        private void ConteudoPlanoAulaForm_Load(object sender, EventArgs e)
        {
            AtualizarDados();
        }
        private void AtualizarDados()
        {
            using (dbContext db = new dbContext())
            {
                planoAulaDetalheBindingSource.DataSource = from d in db.PlanoAulaDetalhes
                                                           where d.IdPlanoAulaCab == this.IdItem
                                                           orderby d.Data ascending
                                                           select d;
            }
        }
        private void toolStripButtonAtulizar_Click(object sender, EventArgs e)
        {
            AtualizarDados();
        }

        private void btnAtualizar_Click(object sender, EventArgs e)
        {
            if (cbxConfirmarAcao.Checked || MessageBox.Show("Confirma a atualização do item selecionado?", "Atualização", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                using (dbContext dc = new dbContext())
                {
                    var planoAulaCab = (from p in dc.PlanoAulaCabs where p.Id == this.IdItem select p).Single();
                    if (planoAulaDetalheBindingSource.Current == null)
                    {
                        btnAdicionarData_Click(sender, e);
                    }
                    int id = ((PlanoAulaDetalhe)planoAulaDetalheBindingSource.Current).Id;
                    var planoAulaDetalhe = (from p in planoAulaCab.PlanoAulaDetalhes
                                            where p.Id == id
                                            select p).Single();

                    planoAulaDetalhe.Data = edtData.Value;
                    planoAulaDetalhe.Conteudo = edtConteudoProgramatico.Text;
                    planoAulaDetalhe.Referencia = edtReferencia.Text;
                    planoAulaDetalhe.HoraFinal = dtpAte.Value.Hour;
                    planoAulaDetalhe.HoraInicio = dtpDe.Value.Hour;
                    planoAulaDetalhe.MinutoInicio = dtpDe.Value.Minute;
                    planoAulaDetalhe.MinutoFinal = dtpAte.Value.Minute;

                    dc.SubmitChanges();
                }
                AtualizarDados();
                if (planoAulaDetalheBindingSource.Position < planoAulaDetalheBindingSource.Count - 1)
                {
                    planoAulaDetalheBindingSource.MoveNext();
                    edtConteudoProgramatico.Focus();
                }
            }
        }

        private void btnAdicionarData_Click(object sender, EventArgs e)
        {
            using (dbContext dc = new dbContext())
            {
                var planoAulaCab = (from p in dc.PlanoAulaCabs where p.Id == this.IdItem select p).Single();

                PlanoAulaDetalhe pad = new PlanoAulaDetalhe { 
                    Data = edtData.Value, 
                    IdPlanoAulaCab = planoAulaCab.Id,
                    Conteudo = edtConteudoProgramatico.Text,
                    Referencia = edtReferencia.Text,
                    HoraFinal = dtpAte.Value.Hour,
                    HoraInicio = dtpDe.Value.Hour,
                    MinutoInicio = dtpDe.Value.Minute,
                    MinutoFinal = dtpAte.Value.Minute
                };
                planoAulaCab.PlanoAulaDetalhes.Add(pad);
                dc.SubmitChanges();
            }
            AtualizarDados();
        }

        private void btnExcluirData_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Confirma a exclusão do item selecionado?", "Exclusão", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                using (dbContext dc = new dbContext())
                {
                    int id = ((PlanoAulaDetalhe)planoAulaDetalheBindingSource.Current).Id;
                    var itemAula = (from i in dc.PlanoAulaDetalhes
                                    where i.Id == id
                                    select i).Single();
                    dc.PlanoAulaDetalhes.DeleteOnSubmit(itemAula);
                    dc.SubmitChanges();
                }
                AtualizarDados();
            }
        }

        private void toolStripButtonVisualizar_Click(object sender, EventArgs e)
        {   
            new relPlanoAulaForm(this.IdItem).ExbirFormulario(this);
        }

        private void dgvDados_SelectionChanged(object sender, EventArgs e)
        {
            if (planoAulaDetalheBindingSource.Current != null)
            {
                using (dbContext dc = new dbContext())
                {
                    var planoAulaCab = (from p in dc.PlanoAulaCabs where p.Id == this.IdItem select p).Single();
                    int id = ((PlanoAulaDetalhe)planoAulaDetalheBindingSource.Current).Id;
                    var planoAulaDetalhe = (from p in planoAulaCab.PlanoAulaDetalhes
                                            where p.Id == id
                                            select p).Single();
                    if (planoAulaDetalhe != null)
                    {
                        edtConteudoProgramatico.Text = planoAulaDetalhe.Conteudo;
                        edtReferencia.Text = planoAulaDetalhe.Referencia;
                        edtData.Value = planoAulaDetalhe.Data;
                        dtpDe.Value = new DateTime(1901, 01, 01, planoAulaDetalhe.HoraInicio, planoAulaDetalhe.MinutoInicio, 00);
                        dtpAte.Value = new DateTime(1901, 01, 01, planoAulaDetalhe.HoraFinal, planoAulaDetalhe.MinutoFinal, 00);
                    }
                }
            }
        }

        private void dtpDe_ValueChanged(object sender, EventArgs e)
        {
            if (dtpAte.Value < dtpDe.Value)
            {
                dtpAte.Value = dtpDe.Value.AddMinutes(140);
            }
        }

        int horaInicio = 0, horaFim = 0, minutoInicio = 0, minutoFim = 0;
        private void dgvDados_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            switch (e.ColumnIndex)
            {
                case 0:
                    {
                        if (e.Value != null)
                            dgvDados.Rows[e.RowIndex].Cells[7].Value = CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int)e.Value.To<DateTime>().DayOfWeek];
                        break;
                    }
                case 8:
                    {
                        horaInicio = dgvDados.Rows[e.RowIndex].Cells[3].Value.To<int>();
                        minutoInicio = dgvDados.Rows[e.RowIndex].Cells[4].Value.To<int>();
                        horaFim = dgvDados.Rows[e.RowIndex].Cells[5].Value.To<int>();
                        minutoFim = dgvDados.Rows[e.RowIndex].Cells[6].Value.To<int>();
                        e.Value = string.Format("{0}:{1}", horaInicio.ToString().PadLeft(2, '0'), minutoInicio.ToString().PadLeft(2, '0'));
                        break;
                    }
                case 9:
                    {
                        e.Value = string.Format("{0}:{1}", horaFim.ToString().PadLeft(2, '0'), minutoFim.ToString().PadLeft(2, '0'));
                        break;
                    }
            }
        }
    }
}
